/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.web.wizards.beanjsp.model;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import org.netbeans.modules.web.wizards.beanjsp.util.*;
import org.netbeans.modules.web.wizards.beanjsp.ui.*;
import org.netbeans.modules.web.util.*;
import org.openide.util.*;
public class JSPBeanTableModel extends javax.swing.table.AbstractTableModel {
JSPVector useBeans;
/**
* @associates JSPBean
*/
HashMap useBeansMap;
public static final int BEAN_CLASS_COL = 0;
public static final int BEAN_VARIABLE_COL = 1;
public static final int BEAN_SCOPE_COL = 2;
public static final int NUM_COLUMNS = 3;
private String beanClassColName;
private String beanVarColName;
private String beanScopeColName;
public JSPBeanTableModel(JSPVector useBeans) {
this.useBeans = useBeans;
this.useBeansMap = new HashMap();
java.util.ResourceBundle resBundle = NbBundle.getBundle(JSPPageWizard.i18nBundle);
beanClassColName = resBundle.getString("JBW_BTC_BeanClass"); // NOI18N
beanVarColName = resBundle.getString("JBW_BTC_Variable"); // NOI18N
beanScopeColName = resBundle.getString("JBW_BTC_Scope"); // NOI18N
}
//// table model handling
public int getColumnCount() { return NUM_COLUMNS; }
public int getRowCount() { return useBeans.size(); }
public String getColumnName(int column) {
switch (column) {
case BEAN_CLASS_COL:
return beanClassColName;
case BEAN_VARIABLE_COL:
return beanVarColName;
case BEAN_SCOPE_COL:
return beanScopeColName;
default:
return ""; // NOI18N
}
}
public Class getColumnClass(int column) {
switch (column) {
case BEAN_CLASS_COL:
return String.class;
case BEAN_VARIABLE_COL:
return String.class;
case BEAN_SCOPE_COL:
return JSPBean.class;
default:
return Object.class;
}
}
public boolean isCellEditable(int rowIndex, int columnIdx) {
switch (columnIdx) {
case BEAN_CLASS_COL:
return false;
case BEAN_VARIABLE_COL:
return true;
case BEAN_SCOPE_COL:
return true;
default:
return false;
}
}
public Object getValueAt(int row, int column) {
JSPBean jspBean = (JSPBean) useBeans.get(row);
switch (column) {
case BEAN_CLASS_COL:
return jspBean.getBeanInfo().getBeanDescriptor().getBeanClass().getName();
case BEAN_VARIABLE_COL:
return jspBean.getBeanVariableName();
case BEAN_SCOPE_COL:
return jspBean.toScopeString(jspBean.getBeanScope());
default:
return ""; // NOI18N
}
}
public void setValueAt(Object aValue, int row, int column) {
JSPBean jspBean = (JSPBean) useBeans.get(row);
switch (column) {
case BEAN_VARIABLE_COL:
// jspBean.setBeanVariableName((String)aValue);
setUseBeanVariableName(jspBean, (String)aValue);
break;
case BEAN_SCOPE_COL:
jspBean.setBeanScope( JSPBean.toScopeValue((String)aValue));
break;
}
//// todo: notify the change to all model listeners
}
//// key management methods
void setUseBeanVariableName(JSPBean jspBean, String newVariableName) {
modifyUseBeanMapKey(jspBean,newVariableName);
}
void modifyUseBeanMapKey(JSPBean jspBean, String newKey) {
if(useBeansMap.get(newKey) == null) {
useBeansMap.remove(jspBean.getBeanVariableName());
jspBean.setBeanVariableName(newKey);
useBeansMap.put(jspBean.getBeanVariableName(),jspBean);
}
}
void setUseBeanMapKey(JSPBean jspBean) {
try {
int MAX_KEYS = 100;
String rootKey = jspBean.getBeanVariableName();
String useBeanMapKey = rootKey;
for(int i=0; i < MAX_KEYS; ++i) {
JSPBean foundJSPBean = (JSPBean) useBeansMap.get(useBeanMapKey);
if(foundJSPBean == null) {
jspBean.setBeanVariableName(useBeanMapKey);
useBeansMap.put(jspBean.getBeanVariableName(),jspBean);
return;
}
useBeanMapKey = rootKey+i;
}
//NB must through exception
// throw new Exception("Can not add more than 100 variables of the same type")
}catch (Exception ex) {Debug.print(ex);}
}
void addToKeyMap(JSPBean jspBean) {
try {
setUseBeanMapKey(jspBean);
useBeansMap.put(jspBean.getBeanVariableName(),jspBean);
}catch(Exception ex) { Debug.print(ex);}
}
void removeFromKeyMap(JSPBean jspBean) {
try {
useBeansMap.remove(jspBean.getBeanVariableName());
}catch(Exception ex){Debug.print(ex);}
}
void removeAllFromKeyMap() {
useBeansMap.clear();
}
void removeAllFromKeyMap(Object jspItemKey) {
Map removeMap = new HashMap();
Iterator mapIterator = useBeansMap.values().iterator();
for(;mapIterator.hasNext();) {
JSPBean jspBean = (JSPBean)mapIterator.next();
if(jspBean.getKey().equals(jspItemKey))
removeMap.put(jspBean.getBeanVariableName(),jspBean);
}
mapIterator = removeMap.values().iterator();
for(;mapIterator.hasNext();) {
JSPBean jspBean = (JSPBean)mapIterator.next();
useBeansMap.remove(jspBean.getBeanVariableName());
}
}
//// USE BEAN MODEL methos
public void add(JSPBean jspBean) {
addToKeyMap(jspBean);
useBeans.add(jspBean);
int idx = useBeans.size()-1;
this.fireTableRowsInserted(idx,idx,jspBean);
}
public JSPBean remove(int idx) {
JSPBean jspBean = (JSPBean) useBeans.remove(idx);
removeFromKeyMap(jspBean);
this.fireTableRowsDeleted(idx,idx,jspBean);
return jspBean;
}
public int moveUp(int idx) {
int newIdx = useBeans.moveUp(idx);
this.fireTableDataChanged();
return newIdx;
}
public int moveDown(int idx) {
int newIdx = useBeans.moveDown(idx);
this.fireTableDataChanged();
return newIdx;
}
public void removeAll() {
int idx = useBeans.size()-1;
useBeans.removeAllElements();
removeAllFromKeyMap();
if(idx >= 0 )
this.fireTableRowsDeleted(0,idx,null);
}
public boolean removeAll(Object key) {
boolean itemsRemoved = useBeans.removeAllByKey(key);
removeAllFromKeyMap(key);
if(itemsRemoved) {
this.fireTableDataChanged();
}
return itemsRemoved;
}
public JSPVector getJSPBeans() { return useBeans; }
public void fireTableRowsDeleted(int firstRow, int lastRow, JSPBean jspBean) {
JSPBeanTableModelEvent evt = new JSPBeanTableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
evt.setJSPBean(jspBean); super.fireTableChanged(evt);
}
public void fireTableRowsInserted(int firstRow, int lastRow, JSPBean jspBean) {
JSPBeanTableModelEvent evt = new JSPBeanTableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
evt.setJSPBean(jspBean); super.fireTableChanged(evt);
}
public class JSPBeanTableModelEvent extends TableModelEvent {
JSPBean jspBean = null;
public JSPBeanTableModelEvent(TableModel source, int firstRow,
int lastRow,
int column,
int type){
super(source,firstRow,lastRow,column,type);
}
public JSPBean getJSPBean() { return jspBean; }
public void setJSPBean(JSPBean jspBean) { this.jspBean = jspBean;}
}
}